Function.prototype.selfBind = function (target,...args1){
    // console.log(this) // 谁调用就指向谁 
    const func = this;
    // func : abc这个函数
    // 返回值 : 是什么 ? 返回的是一个函数
    //boundFunc : 代表的就是 Fn
    const boundFunc = function(...args2){
      // 1. 将参数合并
      const args = [...args1,...args2];
      // 2. 判断new还是没new
      if(new.target){ // new了
        let res = func.apply(this,args);
        if((typeof res  === 'object' || 'function' )&& res !== null){
          return res;
        }else{
          return this;
        }
      }else{ // 没new
        return func.apply(target,args);
      }
      // 3. 将this指向target
      // 4. 处理返回值
    }
    return boundFunc;
  }
  
  function abc(...args){
    this.q = 'params'
    console.log(this,args)
    return {pp:'pp'}
  }
  
  const Fn = abc.selfBind({a:123},1,2,3,4)
  // console.log(Fn(7,8,9,10))
  const res = new Fn(7,8,9,10)
  console.log(res)